home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / doom / quake.zip / TORNADO.ZIP / TORNADO.QC < prev    next >
Text File  |  1997-04-30  |  8KB  |  331 lines

  1. //////////////////////////////////////////////////////////
  2. // TORNADO - Version 1.0                                //
  3. // 04/30/97 - John Mason                                //
  4. // jwmason1@ix.netcom.com                                //
  5. //                                                        //
  6. // 1.0 - 04/30/97 - Initial release                        //
  7. //                                                      //
  8. //////////////////////////////////////////////////////////
  9.                                                           
  10. float fBombLife;
  11. float CycleNum;
  12. float CycleSpeed;
  13. vector RiserOrigin;
  14.  
  15. void() W_LaunchTornadoBomb;
  16. void() TornadoBombTouch;
  17. void() TornadoBombRiser;
  18. void() TornadoBombTornado;
  19. void() TornadoBombRiserExplode;
  20.  
  21. void() W_LaunchTornadoBomb =
  22. {
  23.     local entity sb_grenade;
  24.     
  25.     fBombLife = 0;
  26.  
  27.     // If player has less than 10 rockets, don't fire Tornado Bomb
  28.     if ((self.ammo_rockets < 5) || !(self.weapon & (IT_GRENADE_LAUNCHER | IT_TORNADO_BOMB1 | IT_TORNADO_BOMB2)))
  29.     {
  30.         sprint(self,"Not enough ammo to launch Tornado Bomb\n");
  31.         return;
  32.     }
  33.  
  34.     // Subtract 5 rockets from players ammo
  35.     self.currentammo = self.ammo_rockets = self.ammo_rockets - 5;
  36.     
  37.     sound (self, CHAN_WEAPON, "weapons/grenade.wav", 1, ATTN_NORM);
  38.     
  39.     // Set the recoil angle
  40.     self.punchangle_x = -5;
  41.     
  42.     // Spawn the grenade - standard id style
  43.     sb_grenade = spawn ();
  44.     sb_grenade.owner = self;
  45.     sb_grenade.movetype = MOVETYPE_BOUNCE;
  46.     sb_grenade.solid = SOLID_BBOX;
  47.     sb_grenade.classname = "sb_grenade";
  48.         
  49.     // Set the missile speed    
  50.     makevectors (self.v_angle);
  51.  
  52.     if (self.v_angle_x)
  53.         sb_grenade.velocity = v_forward * 600 + v_up * 200 + crandom() * v_right * 10 + crandom() * v_up * 10;
  54.     else
  55.     {
  56.         sb_grenade.velocity = aim(self, 10000);
  57.         sb_grenade.velocity = sb_grenade.velocity * 600;
  58.         sb_grenade.velocity_z = 200;
  59.     }
  60.                 
  61.     sb_grenade.avelocity = '300 300 300';
  62.     sb_grenade.angles = vectoangles(sb_grenade.velocity);
  63.     sb_grenade.touch = TornadoBombTouch;
  64.                    
  65.     // Set Duration                   
  66.     sb_grenade.nextthink = time + 1;
  67.     sb_grenade.think = TornadoBombRiser;
  68.  
  69.     setmodel (sb_grenade, "progs/grenade.mdl");
  70.     setsize (sb_grenade, '0 0 0', '0 0 0');            
  71.     setorigin (sb_grenade, self.origin);
  72. };
  73.  
  74. void() TornadoBombTouch =
  75. {
  76.     // Did the grenade hit a someone?
  77.     if (other.takedamage)
  78.     {
  79.         sound (self, CHAN_WEAPON, "weapons/bounce.wav", 1, ATTN_NORM);
  80.         return;
  81.     }
  82.     else
  83.     {
  84.         sound (self, CHAN_WEAPON, "weapons/bounce.wav", 1, ATTN_NORM);
  85.         if (self.velocity == '0 0 0')
  86.             self.avelocity = '0 0 0';
  87.     }    
  88. };
  89.  
  90. void() TornadoBombRiser=
  91. {
  92.     local entity sb_riser;
  93.  
  94.     // Make the SBGrenade stop
  95.     self.movetype=MOVETYPE_NONE;
  96.     self.velocity='0 0 0';
  97.     
  98.     // Draw a tiny explosion (no particles)        
  99.     setmodel(self, "progs/s_explod.spr");
  100.     s_explode1();
  101.  
  102.     sound (self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM);
  103.  
  104.     // Spawn and animate the 'second stage'
  105.     sb_riser = spawn();
  106.     sb_riser.owner = self.owner;
  107.     sb_riser.movetype = MOVETYPE_BOUNCE;
  108.     sb_riser.solid = SOLID_BBOX;
  109.     sb_riser.classname = "sb_riser";
  110.  
  111.     // Set speed
  112.     sb_riser.velocity = '0 0 25';
  113.     sb_riser.avelocity = '250 250 0';
  114.     sb_riser.touch = TornadoBombTouch;
  115.  
  116.     // Set Duration
  117.     sb_riser.nextthink = time + 0.1;
  118.     sb_riser.think = TornadoBombTornado;
  119.  
  120.     setmodel (sb_riser, "progs/grenade.mdl");
  121.     setsize (sb_riser, '0 0 0', '0 0 0');
  122.     setorigin (sb_riser, self.origin);
  123.  
  124.     RiserOrigin = self.origin;
  125.  
  126.     CycleNum = 1;
  127.     CycleSpeed = 1;
  128.     fBombLife = 7;
  129. };
  130.  
  131. void() TornadoBombTornado=
  132. {
  133.     local entity head;
  134.     local vector vdestdelta;
  135.     local float len, traveltime;
  136.  
  137.     local entity missile1, missile2, missile3, missile4, missile5;
  138.  
  139.     T_RadiusDamage (self, self.owner, 5 * (7 - fBombLife), world);
  140.  
  141.     if (fBombLife >= 1)
  142.     {
  143.         if (CycleNum == 1)
  144.         {
  145.             vdestdelta_x = RiserOrigin_x + 25000;
  146.             vdestdelta_y = RiserOrigin_y;
  147.             sound (self, CHAN_WEAPON, "zombie/z_shot1.wav", 1, ATTN_NORM);
  148.         }
  149.         else if (CycleNum == 2)
  150.         {
  151.             vdestdelta_x = RiserOrigin_x + 13000;
  152.             vdestdelta_y = RiserOrigin_y + 13000;
  153.         }
  154.         else if (CycleNum == 3)
  155.         {
  156.             vdestdelta_x = RiserOrigin_x;
  157.             vdestdelta_y = RiserOrigin_y + 25000;
  158.         }
  159.         else if (CycleNum == 4)
  160.         {
  161.             vdestdelta_x = RiserOrigin_x - 13000;
  162.             vdestdelta_y = RiserOrigin_y + 13000;
  163.         }
  164.         else if (CycleNum == 5)
  165.         {
  166.             vdestdelta_x = RiserOrigin_x - 25000;
  167.             vdestdelta_y = RiserOrigin_y;
  168.         }
  169.         else if (CycleNum == 6)
  170.         {
  171.             vdestdelta_x = RiserOrigin_x - 13000;
  172.             vdestdelta_y = RiserOrigin_y - 13000;
  173.         }
  174.         else if (CycleNum == 7)
  175.         {
  176.             vdestdelta_x = RiserOrigin_x;
  177.             vdestdelta_y = RiserOrigin_y - 25000;
  178.         }
  179.         else if (CycleNum == 8)
  180.         {
  181.             vdestdelta_x = RiserOrigin_x + 13000;
  182.             vdestdelta_y = RiserOrigin_y - 13000;
  183.         }
  184.  
  185.         vdestdelta_z = RiserOrigin_z;
  186.         len = vlen(vdestdelta);
  187.         traveltime = len / CycleSpeed;
  188.         
  189.         if (CycleSpeed <= 32000)
  190.             CycleSpeed = CycleSpeed + 10;
  191.  
  192.         self.velocity = vdestdelta * (1/traveltime);
  193.         self.velocity_z = 115;
  194.         
  195.         if ((fBombLife <= 6.5) && (TornadoBombMode == 1))
  196.         {
  197.             // missile1
  198.             missile1 = spawn ();
  199.             missile1.owner = self;
  200.             missile1.movetype = MOVETYPE_BOUNCE;
  201.             missile1.solid = SOLID_BBOX;
  202.  
  203.             missile1.velocity = '0 0 0';
  204.  
  205.             missile1.touch = SUB_Null;
  206.             missile1.nextthink = time + 1;
  207.             missile1.think = SUB_Remove;
  208.  
  209.             setmodel (missile1, "progs/zom_gib.mdl");
  210.             setsize (missile1, '0 0 0', '0 0 0');        
  211.             setorigin (missile1, self.origin);
  212.  
  213.             // missile2
  214.             missile2 = spawn ();
  215.             missile2.owner = self;
  216.             missile2.movetype = MOVETYPE_BOUNCE;
  217.             missile2.solid = SOLID_BBOX;
  218.  
  219.             missile2.velocity = '0 0 0';
  220.  
  221.             missile2.touch = SUB_Null;
  222.             missile2.nextthink = time + 1;
  223.             missile2.think = SUB_Remove;
  224.  
  225.             setmodel (missile2, "progs/zom_gib.mdl");
  226.             setsize (missile2, '0 0 0', '0 0 0');        
  227.             setorigin (missile2, self.origin + '4 0 4');
  228.             
  229.             // missile3
  230.             missile3 = spawn ();
  231.             missile3.owner = self;
  232.             missile3.movetype = MOVETYPE_BOUNCE;
  233.             missile3.solid = SOLID_BBOX;
  234.  
  235.             missile3.velocity = '0 0 0';
  236.  
  237.             missile3.touch = SUB_Null;
  238.             missile3.nextthink = time + 1;
  239.             missile3.think = SUB_Remove;
  240.  
  241.             setmodel (missile3, "progs/zom_gib.mdl");
  242.             setsize (missile3, '0 0 0', '0 0 0');        
  243.             setorigin (missile3, self.origin + '0 4 4');
  244.  
  245.             // missile4
  246.             missile4 = spawn ();
  247.             missile4.owner = self;
  248.             missile4.movetype = MOVETYPE_BOUNCE;
  249.             missile4.solid = SOLID_BBOX;
  250.  
  251.             missile4.velocity = '0 0 0';
  252.  
  253.             missile4.touch = SUB_Null;
  254.             missile4.nextthink = time + 1;
  255.             missile4.think = SUB_Remove;
  256.  
  257.             setmodel (missile4, "progs/zom_gib.mdl");
  258.             setsize (missile4, '0 0 0', '0 0 0');        
  259.             setorigin (missile4, self.origin + '8 0 8');
  260.  
  261.             // missile5
  262.             missile5 = spawn ();
  263.             missile5.owner = self;
  264.             missile5.movetype = MOVETYPE_BOUNCE;
  265.             missile5.solid = SOLID_BBOX;
  266.  
  267.             missile5.velocity = '0 0 0';
  268.  
  269.             missile5.touch = SUB_Null;
  270.             missile5.nextthink = time + 1;
  271.             missile5.think = SUB_Remove;
  272.  
  273.             setmodel (missile5, "progs/zom_gib.mdl");
  274.             setsize (missile5, '0 0 0', '0 0 0');        
  275.             setorigin (missile5, self.origin + '0 8 8');
  276.         }
  277.  
  278.         CycleNum = CycleNum + 1;
  279.  
  280.         if (CycleNum >= 9)
  281.             CycleNum = 1;
  282.         
  283.         head = findradius(self.origin, 1200);                      
  284.         while (head)                      
  285.         {
  286.             self.enemy = head;
  287.             
  288.             if (visible(head))
  289.                 if ((head.flags & FL_MONSTER) || (head.classname == "player"))
  290.                     if (head != self.owner)
  291.                     {
  292.                         vdestdelta = self.origin - self.enemy.origin;
  293.                         len = vlen(vdestdelta);
  294.                         traveltime = len / 500;
  295.                 
  296.                         self.enemy.flags = self.enemy.flags - (self.enemy.flags & FL_ONGROUND);
  297.                         self.enemy.velocity = vdestdelta * (1/traveltime);
  298.                     }
  299.  
  300.             head = head.chain;
  301.         }    
  302.  
  303.         fBombLife = fBombLife - 0.10;        
  304.         self.nextthink = time + 0.10;
  305.     }
  306.     else
  307.     {
  308.         self.nextthink = time + 0.10;
  309.         self.think = TornadoBombRiserExplode;
  310.     }
  311. };
  312.  
  313. void() TornadoBombRiserExplode = 
  314. {
  315.     T_RadiusDamage (self, self.owner, 150, world);
  316.  
  317.     WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  318.     WriteByte (MSG_BROADCAST, TE_EXPLOSION);
  319.     WriteCoord (MSG_BROADCAST, self.origin_x);
  320.     WriteCoord (MSG_BROADCAST, self.origin_y);
  321.     WriteCoord (MSG_BROADCAST, self.origin_z);
  322.  
  323.     BecomeExplosion ();
  324. };
  325.  
  326. //////////////////////////////////////////////////////////
  327. //                                                        //
  328. // End of TORNADO_BOMB code                                //
  329. //                                                        //
  330. //////////////////////////////////////////////////////////
  331.